home *** CD-ROM | disk | FTP | other *** search
/ PC User 2004 August / Disc 1 / PCU0804CD1.iso / software / browsers / files / opera1.exe / OPERA.JAR / com / opera / PluginPanel.class (.txt) < prev    next >
Encoding:
Java Class File  |  2004-02-12  |  11.8 KB  |  571 lines

  1. package com.opera;
  2.  
  3. import java.applet.Applet;
  4. import java.applet.AppletContext;
  5. import java.applet.AppletStub;
  6. import java.awt.BorderLayout;
  7. import java.awt.Color;
  8. import java.awt.Dimension;
  9. import java.awt.Font;
  10. import java.awt.FontMetrics;
  11. import java.awt.Frame;
  12. import java.awt.Graphics;
  13. import java.awt.Panel;
  14. import java.net.MalformedURLException;
  15. import java.net.URL;
  16. import java.util.Hashtable;
  17. import java.util.Iterator;
  18. import java.util.StringTokenizer;
  19. import java.util.Vector;
  20.  
  21. public class PluginPanel extends Panel implements AppletStub, Runnable {
  22.    private static final int APPSTATE_UNKNOWN = 0;
  23.    private static final int APPSTATE_LOADING = 1;
  24.    private static final int APPSTATE_NOTFOUND = 2;
  25.    private static final int APPSTATE_STOPPED = 3;
  26.    private static final int APPSTATE_RUNNING = 4;
  27.    private static final int APPSTATE_CRASHED = 5;
  28.    private static final int APPSTATE_DESTROYED = 6;
  29.    private static final int APPSTATE_INTERRUPTED = 7;
  30.    private static final int APPSTATE_CLASSFORMATERROR = 8;
  31.    private int appletState = 0;
  32.    private Applet applet;
  33.    private PluginContext context;
  34.    private int inline_elm;
  35.    private URL codeBase;
  36.    private URL docBase;
  37.    private Hashtable params;
  38.    private Hashtable attr;
  39.    private PluginClassLoader loader;
  40.    private Thread loaderThread = null;
  41.    private Thread destroyThread = null;
  42.    private static Hashtable classLoaders = new Hashtable();
  43.    private static int noRefMax = 10;
  44.    private static Vector noRefLoaders = new Vector();
  45.  
  46.    protected static void setClassLoaderCacheSize(int var0) {
  47.       if (var0 < 0) {
  48.          var0 = 0;
  49.       }
  50.  
  51.       noRefMax = var0;
  52.       System.out.println("ClassLoader cache size: " + noRefMax);
  53.    }
  54.  
  55.    private int getWidthParam() {
  56.       if (this.attr != null) {
  57.          String var1 = (String)this.attr.get("width");
  58.          if (var1 != null) {
  59.             return new Integer(var1);
  60.          }
  61.       }
  62.  
  63.       return 150;
  64.    }
  65.  
  66.    private int getHeightParam() {
  67.       if (this.attr != null) {
  68.          String var1 = (String)this.attr.get("height");
  69.          if (var1 != null) {
  70.             return new Integer(var1);
  71.          }
  72.       }
  73.  
  74.       return 150;
  75.    }
  76.  
  77.    public PluginPanel(PluginContext var1, Hashtable var2, Hashtable var3, URL var4, int var5) {
  78.       try {
  79.          this.setBackground(new Color(200, 200, 200));
  80.          this.setLayout(new BorderLayout());
  81.          this.context = var1;
  82.          this.attr = var2;
  83.          this.params = var3;
  84.          this.docBase = var4;
  85.          this.inline_elm = var5;
  86.          String var6 = this.getParameter("java_codebase");
  87.          if (var6 == null) {
  88.             var6 = this.getParameter("codebase");
  89.          }
  90.  
  91.          if (var6 != null) {
  92.             if (var6.startsWith("file://localhost/")) {
  93.                var6 = "file://" + var6.substring(16);
  94.             }
  95.  
  96.             if (!var6.endsWith("/")) {
  97.                var6 = var6 + "/";
  98.             }
  99.  
  100.             try {
  101.                this.codeBase = new URL(this.docBase, var6);
  102.             } catch (MalformedURLException var12) {
  103.             }
  104.          }
  105.  
  106.          String var7 = this.docBase.getFile();
  107.          URL var8 = null;
  108.          int var9 = var7.lastIndexOf(47);
  109.          if (var9 >= 0 && var9 < var7.length() - 1) {
  110.             try {
  111.                var8 = new URL(this.docBase, var7.substring(0, var9 + 1));
  112.             } catch (MalformedURLException var11) {
  113.                var11.printStackTrace(System.err);
  114.             }
  115.          }
  116.  
  117.          if (var8 == null) {
  118.             var8 = this.docBase;
  119.          }
  120.  
  121.          if (this.codeBase == null) {
  122.             this.codeBase = var8;
  123.          }
  124.  
  125.          String var10 = this.getParameter("java_archive");
  126.          if (var10 == null) {
  127.             var10 = this.getParameter("archive");
  128.          }
  129.  
  130.          if (this.getParameter("cache_archive") != null) {
  131.             if (var10 != null) {
  132.                var10 = var10 + "," + this.getParameter("cache_archive");
  133.             } else {
  134.                var10 = this.getParameter("cache_archive");
  135.             }
  136.          }
  137.  
  138.          this.loader = getClassLoader(this.codeBase, var8, var10);
  139.          this.loader.grab();
  140.          if (var1 != null) {
  141.             var1.setClassLoader(this.loader);
  142.          }
  143.       } catch (Exception var13) {
  144.          var13.printStackTrace(System.err);
  145.       }
  146.  
  147.    }
  148.  
  149.    static PluginClassLoader getClassLoader(URL var0, URL var1, String var2) {
  150.       String var3 = var0.toString();
  151.       if (var2 != null) {
  152.          var3 = var3 + "," + var2.trim();
  153.       }
  154.  
  155.       PluginClassLoader var4 = (PluginClassLoader)classLoaders.get(var3);
  156.       if (var4 == null) {
  157.          var4 = new PluginClassLoader(var0, var3);
  158.          if (var2 != null) {
  159.             StringTokenizer var5 = new StringTokenizer(var2, ",", false);
  160.  
  161.             while(var5.hasMoreTokens()) {
  162.                String var6 = var5.nextToken().trim();
  163.  
  164.                try {
  165.                   var4.addJar(new URL(var0, var6));
  166.                } catch (IllegalArgumentException var9) {
  167.                   var9.printStackTrace(System.err);
  168.                } catch (MalformedURLException var10) {
  169.                   var10.printStackTrace(System.err);
  170.                }
  171.             }
  172.          }
  173.  
  174.          var4.addJar(var0);
  175.          if (var1 != var0) {
  176.             var4.addJar(var1);
  177.          }
  178.  
  179.          classLoaders.put(var3, var4);
  180.       } else {
  181.          noRefLoaders.remove(var4);
  182.       }
  183.  
  184.       return var4;
  185.    }
  186.  
  187.    static void cacheClassLoader(PluginClassLoader var0) {
  188.       if (noRefMax <= 0) {
  189.          classLoaders.remove(var0.getKey());
  190.       } else {
  191.          if (noRefLoaders.size() >= noRefMax) {
  192.             classLoaders.remove(((PluginClassLoader)noRefLoaders.get(0)).getKey());
  193.             noRefLoaders.remove(0);
  194.          }
  195.  
  196.          noRefLoaders.add(var0);
  197.       }
  198.  
  199.    }
  200.  
  201.    static void clearClassLoaderCache() {
  202.       Iterator var0 = classLoaders.values().iterator();
  203.  
  204.       while(var0.hasNext()) {
  205.          PluginClassLoader var1 = (PluginClassLoader)var0.next();
  206.          if (var1.getUsageCount() == 0) {
  207.             var0.remove();
  208.          }
  209.       }
  210.  
  211.    }
  212.  
  213.    static void printClassLoaders() {
  214.       System.out.println("Classloaders:");
  215.  
  216.       for(PluginClassLoader var1 : classLoaders.values()) {
  217.          System.out.println(var1.getKey());
  218.       }
  219.  
  220.    }
  221.  
  222.    static Class findClass(String var0, String var1) {
  223.       try {
  224.          int var3 = var1.lastIndexOf(47);
  225.          URL var2;
  226.          if (var3 >= 0 && var3 < var1.length() - 1) {
  227.             var2 = new URL(var1.substring(0, var3 + 1));
  228.          } else {
  229.             var2 = new URL(var1);
  230.          }
  231.  
  232.          PluginClassLoader var4 = getClassLoader(var2, var2, (String)null);
  233.          if (var4 != null) {
  234.             var4.grab();
  235.             var4.addJar(var2);
  236.             ThreadGroup var6 = var4.getThreadGroup();
  237.             FindClassThread var7 = new FindClassThread(var6, var4, var0);
  238.             Class var5;
  239.             synchronized(var7.syncObject) {
  240.                var7.start();
  241.  
  242.                try {
  243.                   var7.syncObject.wait();
  244.                } catch (InterruptedException var11) {
  245.                }
  246.  
  247.                var5 = var7.found_class;
  248.             }
  249.  
  250.             Object var14 = null;
  251.             var4.release();
  252.             return var5;
  253.          } else {
  254.             return null;
  255.          }
  256.       } catch (Exception var13) {
  257.          var13.printStackTrace(System.out);
  258.          return null;
  259.       }
  260.    }
  261.  
  262.    void resizeEmbedBox(int var1, int var2) {
  263.       Dimension var3 = this.getSize();
  264.       if (var3.getWidth() != (double)var1 || var3.getHeight() != (double)var2) {
  265.          Frame var4 = (Frame)this.getParent();
  266.          if (var4 != null) {
  267.             var4.setSize(var1, var2);
  268.          }
  269.  
  270.          this.setSize(var1, var2);
  271.          if (this.applet != null) {
  272.             this.applet.setSize(var1, var2);
  273.          }
  274.  
  275.          this.validate();
  276.          this.attr.put("width", String.valueOf(var1));
  277.          this.attr.put("height", String.valueOf(var2));
  278.       }
  279.    }
  280.  
  281.    public void appletResize(int var1, int var2) {
  282.       this.setSize(var1, var2);
  283.    }
  284.  
  285.    public AppletContext getAppletContext() {
  286.       return this.context;
  287.    }
  288.  
  289.    public URL getCodeBase() {
  290.       return this.codeBase;
  291.    }
  292.  
  293.    public URL getDocumentBase() {
  294.       return this.docBase;
  295.    }
  296.  
  297.    public String getParameter(String var1) {
  298.       String var2 = (String)this.params.get(var1.toLowerCase());
  299.       if (var2 == null) {
  300.          var2 = (String)this.attr.get(var1.toLowerCase());
  301.       }
  302.  
  303.       return var2;
  304.    }
  305.  
  306.    public boolean isActive() {
  307.       return this.appletState == 4;
  308.    }
  309.  
  310.    public void loadApplet() {
  311.       try {
  312.          ThreadGroup var1 = this.loader.getThreadGroup();
  313.          this.loaderThread = new Thread(var1, this);
  314.          this.loaderThread.setContextClassLoader(this.loader);
  315.          this.loaderThread.start();
  316.       } catch (Exception var2) {
  317.          var2.printStackTrace(System.err);
  318.       }
  319.  
  320.    }
  321.  
  322.    public void startApplet() {
  323.       try {
  324.          if (this.applet != null && this.appletState == 3) {
  325.             this.applet.resize(this.getWidthParam(), this.getHeightParam());
  326.             this.applet.start();
  327.             this.appletState = 4;
  328.             this.applet.validate();
  329.             this.applet.setVisible(true);
  330.             this.context.showStatus("Applet started.");
  331.          }
  332.       } catch (Exception var2) {
  333.          var2.printStackTrace(System.err);
  334.          if (this.appletState != 4) {
  335.             this.appletState = 5;
  336.             this.getParent().repaint();
  337.             this.repaint();
  338.          }
  339.       }
  340.  
  341.    }
  342.  
  343.    public void stopApplet() {
  344.       if (this.applet != null && this.appletState == 4) {
  345.          try {
  346.             this.applet.stop();
  347.          } catch (Exception var2) {
  348.             var2.printStackTrace(System.err);
  349.          }
  350.  
  351.          this.appletState = 3;
  352.       }
  353.  
  354.    }
  355.  
  356.    public void destroy() {
  357.       if (this.context != null) {
  358.          this.context.destroyPanel(this);
  359.       }
  360.  
  361.    }
  362.  
  363.    public void destroyApplet() {
  364.       try {
  365.          if (this.loaderThread != null) {
  366.             try {
  367.                this.loaderThread.interrupt();
  368.             } catch (Exception var3) {
  369.                var3.printStackTrace(System.err);
  370.             }
  371.  
  372.             this.loaderThread = null;
  373.          }
  374.  
  375.          if (this.loader != null) {
  376.             this.destroyThread = new Thread(this.loader.getThreadGroup(), this);
  377.             this.destroyThread.setContextClassLoader(this.loader);
  378.             this.destroyThread.start();
  379.             ReleaseLoaderThread var1 = new ReleaseLoaderThread(this.loader);
  380.             ((Thread)var1).start();
  381.          }
  382.       } catch (Exception var4) {
  383.          var4.printStackTrace(System.err);
  384.       } catch (Error var5) {
  385.          var5.printStackTrace(System.err);
  386.       }
  387.  
  388.    }
  389.  
  390.    public Applet getApplet() {
  391.       return this.applet;
  392.    }
  393.  
  394.    public void run() {
  395.       if (Thread.currentThread() == this.destroyThread) {
  396.          if (this.applet != null) {
  397.             if (this.appletState == 4) {
  398.                this.stopApplet();
  399.             }
  400.  
  401.             try {
  402.                this.applet.destroy();
  403.             } catch (Exception var11) {
  404.                var11.printStackTrace(System.err);
  405.             }
  406.  
  407.             this.applet = null;
  408.             this.appletState = 6;
  409.          }
  410.  
  411.          this.destroyThread = null;
  412.       } else {
  413.          try {
  414.             String var1 = this.getParameter("java_code");
  415.             if (var1 == null) {
  416.                var1 = this.getParameter("code");
  417.             }
  418.  
  419.             if (var1 != null) {
  420.                int var2 = var1.length();
  421.                String var3 = var1;
  422.                if (var2 > 6 && var1.startsWith(".class", var2 - 6)) {
  423.                   var3 = var1.substring(0, var2 - 6);
  424.                }
  425.  
  426.                this.appletState = 1;
  427.                this.getParent().repaint();
  428.                this.repaint();
  429.                Class var4 = this.loader.loadClass(var3);
  430.                if (var4 != null) {
  431.                   this.applet = (Applet)var4.newInstance();
  432.                   if (this.applet != null) {
  433.                      this.appletState = 3;
  434.                      this.getParent().repaint();
  435.                      this.repaint();
  436.                      this.applet.setStub(this);
  437.                      this.applet.setVisible(false);
  438.                      this.add("Center", this.applet);
  439.                      this.getParent().validate();
  440.                      this.getParent().setSize(this.getWidthParam(), this.getHeightParam());
  441.                      this.setSize(this.getWidthParam(), this.getHeightParam());
  442.                      this.applet.resize(this.getWidthParam(), this.getHeightParam());
  443.                      this.context.showStatus("Initializing applet.");
  444.  
  445.                      try {
  446.                         this.applet.init();
  447.                         this.getParent().validate();
  448.                         this.getParent().setVisible(true);
  449.                         this.setVisible(true);
  450.                         this.startApplet();
  451.                      } catch (Exception var6) {
  452.                         var6.printStackTrace(System.err);
  453.                         this.appletState = 5;
  454.                         this.getParent().repaint();
  455.                         this.repaint();
  456.                      }
  457.                   } else {
  458.                      this.appletState = 2;
  459.                      this.getParent().repaint();
  460.                      this.repaint();
  461.                   }
  462.                } else {
  463.                   this.appletState = 2;
  464.                   this.getParent().repaint();
  465.                   this.repaint();
  466.                }
  467.             }
  468.  
  469.             this.loaderThread = null;
  470.          } catch (ClassNotFoundException var7) {
  471.             this.appletState = 2;
  472.             this.getParent().repaint();
  473.             this.repaint();
  474.             var7.printStackTrace(System.err);
  475.             this.loaderThread = null;
  476.          } catch (Exception var8) {
  477.             this.appletState = 5;
  478.             this.getParent().repaint();
  479.             this.repaint();
  480.             var8.printStackTrace(System.err);
  481.             this.loaderThread = null;
  482.          } catch (ClassFormatError var9) {
  483.             this.appletState = 8;
  484.             this.getParent().repaint();
  485.             this.repaint();
  486.             var9.printStackTrace(System.err);
  487.          } catch (Error var10) {
  488.             this.appletState = 5;
  489.             this.getParent().repaint();
  490.             this.repaint();
  491.             var10.printStackTrace(System.err);
  492.             this.loaderThread = null;
  493.          }
  494.  
  495.          if (this.context != null && this.inline_elm != 0) {
  496.             this.context.setLoadingFinished(this.inline_elm);
  497.             this.inline_elm = 0;
  498.          }
  499.       }
  500.  
  501.    }
  502.  
  503.    public void paint(Graphics var1) {
  504.       try {
  505.          if (this.appletState != 0 && this.appletState != 4) {
  506.             FontMetrics var2 = var1.getFontMetrics();
  507.             String var3;
  508.             switch (this.appletState) {
  509.                case 1:
  510.                   var3 = "Loading applet...";
  511.                   break;
  512.                case 2:
  513.                   var3 = "Applet not found.";
  514.                   break;
  515.                case 3:
  516.                   var3 = "Applet loaded.";
  517.                   break;
  518.                case 4:
  519.                default:
  520.                   var3 = "";
  521.                   break;
  522.                case 5:
  523.                   var3 = "Applet crashed.";
  524.                   break;
  525.                case 6:
  526.                   var3 = "Applet destroyed.";
  527.                   break;
  528.                case 7:
  529.                   var3 = "Loading interrupted.";
  530.                   break;
  531.                case 8:
  532.                   var3 = "Invalid bytecode.";
  533.             }
  534.  
  535.             int var4 = var2.stringWidth(var3);
  536.             int var5 = (this.getWidth() - var4) / 2;
  537.             if (var5 < 0) {
  538.                var5 = 0;
  539.             }
  540.  
  541.             var1.drawString(var3, var5, this.getHeight() / 2);
  542.          }
  543.       } catch (Exception var6) {
  544.          var6.printStackTrace(System.err);
  545.       }
  546.  
  547.    }
  548.  
  549.    private static PluginPanel newPanel(int var0, int var1, int var2, String var3, String[] var4, String[] var5, String[] var6, String[] var7) {
  550.       try {
  551.          PluginContext var8 = PluginContextManager.getContext(var1);
  552.          PluginPanel var9 = var8.newPanel(var4, var5, var6, var7, var3, var2);
  553.          String var10 = System.getProperty("browser.opera.frameClassName");
  554.          Frame var11 = createNewFrame(var10.replace('.', '/'), var0);
  555.          var11.add(var9);
  556.          var9.loadApplet();
  557.          var11.setVisible(true);
  558.          var9.setVisible(true);
  559.          Graphics var12 = var9.getGraphics();
  560.          var12.setFont(new Font("sans-serif", 0, 10));
  561.          var9.repaint();
  562.          return var9;
  563.       } catch (Exception var13) {
  564.          var13.printStackTrace(System.err);
  565.          return null;
  566.       }
  567.    }
  568.  
  569.    private static native Frame createNewFrame(String var0, int var1);
  570. }
  571.